package com.eye.catcher.service.generate.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.eye.catcher.utils.RandomIdUtils;
import com.eye.catcher.constants.SbCode;
import com.eye.catcher.entity.TSysDaModule;
import com.eye.catcher.mapper.TSysDaModuleMapper;
import com.eye.catcher.service.generate.ITSysDaModuleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.eye.catcher.system.module.param.ModuleDto;
import com.eye.catcher.system.module.param.ModulePage;
import com.eye.catcher.system.module.param.ModuleResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author huzhiwei
 * @since 2022-02-08
 */
@Slf4j
@Service
public class TSysDaModuleServiceImpl extends ServiceImpl<TSysDaModuleMapper, TSysDaModule> implements ITSysDaModuleService {

    @Autowired
    private TSysDaModuleMapper moduleMapper;

    @Override
    public ModuleResponse getModule(String userId) {
        ModuleResponse res = new ModuleResponse();
        res.setCode(SbCode.TOKEN_VALID_FAILED.getCode());
        res.setMsg(SbCode.TOKEN_VALID_FAILED.getMessage());
        try {
            res.setModuleDtoList(this.reorderModuleDto(moduleMapper.getModule(userId)));
            res.setCode(SbCode.SUCCESS.getCode());
            res.setMsg(SbCode.SUCCESS.getMessage());
        }catch (Exception e){
            e.printStackTrace();
            log.error("getModule:",e);
        }
        return res;
    }

    /**
     *
     * @author huzhiwei
     * @since 2022-02-08
     * @param module
     * @return
     */
    @Override
    public List<ModuleDto> reorderModuleDto(List<ModuleDto> module) {
        Map<String,ModuleDto> stringModuleDtoMap = new HashMap<>();
        //做下整理
        for(ModuleDto moduleDto : module){
            if(stringModuleDtoMap.containsKey(moduleDto.getId())){
                moduleDto.setModuleDtoList(
                        stringModuleDtoMap.get(moduleDto.getId()).getModuleDtoList());
                stringModuleDtoMap.remove(moduleDto.getId());
            }
            if(!stringModuleDtoMap.containsKey(moduleDto.getParentId())){
                if("-1".equals(moduleDto.getParentId())){
                    //多个顶级 要用 id 区分唯一
                    stringModuleDtoMap.put(moduleDto.getId(),moduleDto);
                    continue;
                }
                stringModuleDtoMap.put(moduleDto.getParentId(),
                        new ModuleDto(new ArrayList<ModuleDto>()));
            }
            stringModuleDtoMap.get(moduleDto.getParentId()).getModuleDtoList().add(moduleDto);
        }
        return new ArrayList<>(stringModuleDtoMap.values());
    }

    @Override
    public List<ModuleDto> getModuleByUserId(String userId) {
        return moduleMapper.getModule(userId);
    }
    @Override
    public List<ModuleDto> getAdminModuleList() {
        return moduleMapper.getAllModuleList();
    }
    @Override
    public void addModule(TSysDaModule module) {
        module.setId(RandomIdUtils.getGuid());
        module.setSource(SbCode.DATA_SOURCE_CREATE.getCode());
        this.save(module);
    }

    @Override
    public void deleteModuleByIds(String moduleIds) {
        this.removeByIds(Arrays.asList(moduleIds.split(",")));
    }

    @Override
    public Object getPageModuleList(ModulePage modulePage) {
        Page<TSysDaModule> page=new Page<>(modulePage.getPage().getPageNum(),modulePage.getPage().getPageSize());
        QueryWrapper<TSysDaModule> wrapper = Wrappers.query();
        //组装查询条件
        if(StringUtils.isNotEmpty(modulePage.getModule().getId())){
            wrapper.eq("ID",modulePage.getModule().getId());
        }
        if(StringUtils.isNotEmpty(modulePage.getModule().getParentId())){
            wrapper.eq("PARENT_ID",modulePage.getModule().getParentId());
        }
        if(StringUtils.isNotEmpty(modulePage.getModule().getStatus())){
            wrapper.eq("STATUS",modulePage.getModule().getStatus());
        }
        if(null !=modulePage.getModule().getModuleLevel()){
            wrapper.eq("MODULE_LEVEL",modulePage.getModule().getModuleLevel());
        }
        if(StringUtils.isNotEmpty(modulePage.getModule().getCode())){
            wrapper.eq("CODE",modulePage.getModule().getCode());
        }
        if(StringUtils.isNotEmpty(modulePage.getModule().getName())){
            wrapper.like("NAME",modulePage.getModule().getName());
        }
        if(StringUtils.isNotEmpty(modulePage.getModule().getType())){
            wrapper.eq("TYPE",modulePage.getModule().getType());
        }
        if(StringUtils.isNotEmpty(modulePage.getModule().getUrl())){
            wrapper.like("URL",modulePage.getModule().getUrl());
        }

        wrapper.eq("STATUS", SbCode.DATA_NORMAL.getCode());
        wrapper.orderByAsc(" left(CODE, LOCATE('-', CODE)),PARENT_ID,sort ");
        //list
        IPage<TSysDaModule> returnPage = moduleMapper.page(page, wrapper);
        //总数
        returnPage.setTotal(this.count(wrapper));
        return returnPage;
    }

    @Override
    public ModuleResponse getAllModuleList() {
        ModuleResponse res = new ModuleResponse();
        res.setCode(SbCode.TOKEN_VALID_FAILED.getCode());
        res.setMsg(SbCode.TOKEN_VALID_FAILED.getMessage());
        try {
            res.setModuleDtoList(this.reorderModuleDto(moduleMapper.getAllModuleList()));
            res.setCode(SbCode.SUCCESS.getCode());
            res.setMsg(SbCode.SUCCESS.getMessage());
        }catch (Exception e){
            e.printStackTrace();
            log.error("getModule:",e);
        }
        return res;
    }
    @Override
    public void editModule(TSysDaModule module) {
        QueryWrapper<TSysDaModule> wrapper = Wrappers.query();
        wrapper.eq("ID",module.getId());
        this.update(module,wrapper);
    }

    @Override
    public void updateStausByIds(String ids) {
        QueryWrapper<TSysDaModule> wrapper = Wrappers.query();
        wrapper.in("ID",Arrays.asList(ids.split(",")));
        List<TSysDaModule> list = this.list(wrapper);
        List<TSysDaModule> updateBatchList = new ArrayList<>();
        for(TSysDaModule module : list){
            if(SbCode.DATA_NORMAL.getCode().equals(module.getStatus())){
                module.setStatus(SbCode.DATA_DISABLE.getCode());
            }else{
                module.setStatus(SbCode.DATA_NORMAL.getCode());
            }
//            this.updateById(module);
            updateBatchList.add(module);
        }
        this.updateBatchById(updateBatchList);
    }
}
